import { DataType } from './config'
import { IsNotNull } from './core'
/** 格式化数据
 * @param num 原数据 12323
 * @param { isDecimal = true }是否取自定义的定制的小数位
 * @param { decimals = 2 } 最低保留小数位数 默认 2 位
 * @param { decPoint = '.' } 小数位符号 默认 .
 * @param { thousandsSep = ',' } 前分位符号 默认 ,
 * @param { isRound = false } 是否需要四舍五入 默认 false
 * @returns 格式化后的数据 "12,323.00"
 */
interface FormatOpt {
  num: DataType
  isDecimal?: boolean
  decimals?: number
  decPoint?: string
  thousandsSep?: string
  isRound?: boolean
}
const FormatAmount = (opt: FormatOpt) => {
  const { num, isDecimal, decimals, decPoint, thousandsSep, isRound } = {
    ...{
      thousandsSep: ',',
      decPoint: '.',
      decimals: 2,
      isDecimal: true,
      isRound: false,
    },
    ...opt,
  }
  const number = (num + '').replace(/[^0-9+-Ee.]/g, '')
  const n = !IsNotNull(number) ? 0 : +number
  const dot = number.toString().split('.')[1]
    ? number.toString().split('.')[1]
    : []
  let decimal = isDecimal ? decimals : dot.length || decimals
  if (decimal) {
    decimal = decimal < 6 ? decimal : 6
  }
  const prec = Math.floor(Math.abs(decimal))
  let s: string[] = []
  const toFixedFix = function (n, prec) {
    // Math.pow(10, 2) = 100
    const k = Math.pow(10, prec)
    return '' + Math[isRound ? 'round' : 'floor'](n * k) / k
  }
  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
  const re = /(-?\d+)(\d{3})/
  while (re.test(s[0])) {
    s[0] = s[0].replace(re, '$1' + thousandsSep + '$2')
  }

  if ((s[1] || '').length < prec) {
    s[1] = s[1] || ''
    s[1] += new Array(prec - s[1].length + 1).join('0')
  }
  return s.join(decPoint)
}

export default FormatAmount
